package com.kob.backend.service.impl.user.account;

import com.kob.backend.pojo.User;
import com.kob.backend.service.impl.UserDetailsImpl;
import com.kob.backend.service.user.account.LoginService;
import com.kob.backend.utils.JwtUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
public class LoginServiceImpl implements LoginService {

    @Autowired
    private AuthenticationManager authenticationManager;

//    验证用户名和密码，验证成功后返回jwt token
    @Override
    public Map<String, String> getToken(String username, String password) {
//        用户输入用户名和密码后会进入UsernamePasswordAuthenticationToken进行验证
        UsernamePasswordAuthenticationToken authenticationToken =
                new UsernamePasswordAuthenticationToken(username, password);//封装一下用户名和密码
//        生成的authenticationToken交由authenticationManager管理
//        而AuthenticationManager管理一系列的AuthenticationProvider，
//        而每一个Provider都会通UserDetailsService和UserDetail来返回一个
//        以UsernamePasswordAuthenticationToken实现的带用户名和密码以及权限的Authentication
//        调用了 UserDetailsService.loadUserByUsername() 并进行了密码校验，
//        校验成功就构造一个认证过的 UsernamePasswordAuthenticationToken 对象放入 SecurityContext(上下文).
        Authentication authenticate = authenticationManager.authenticate(authenticationToken);//用户名或密码错误，登录失败会自动处理
        //登录失败则会不执行下列代码，直接处理返回
        UserDetailsImpl loginUser = (UserDetailsImpl) authenticate.getPrincipal();//取出用户信息
        User user = loginUser.getUser();
        String jwt = JwtUtil.createJWT(user.getId().toString());//将user的id封装成Jwt token
        Map<String, String> map = new HashMap<>();
        map.put("message","success");
        map.put("token",jwt);
        return map;
    }
}
